// 成员函数模板
// Members of the template

// 模板可以用作结构,类或模板类的成员.要完全实现STL的设计,必须使用这种特性
#ifndef __63Members_of_template__
#define __63Members_of_template__

#include <iostream>
using std::cout;
using std::endl;

template <typename T>
class beta
{
private:
    // 在类中使用模板作为类对象的成员
    template <typename V>
    class hold
    {
    private:
        V value;

    public:
        hold(V value) : value(value) {}                        // 构造函数
        void show() const { std::cout << value << std::endl; } // 使用cout对象智能识别对象类型
        V Value() const
        {
            return value;
        }
    };
    // 类内创建模板类结束

    // 类中创建几个模板类的实例
    hold<T> q;
    hold<int> n;

public:
    // 使用本类中定义的beta类
    beta(T t, int i) : q(t), n(i) {}
    // 模板方法
    template <typename U>
    U blab(U u, T t) { return (n.Value() + q.Value()) * u / t; }

    void show() const
    {
        q.show();
        n.show();
    };
};

int main(int argc, char const *argv[])
{
    beta<double> guy(3.5, 3);
    cout << "T was set to double" << endl;
    cout << "T was set to T, which is double , then V was set to int \n";
    cout << guy.blab(10, 2.3) << endl;
    cout << "U was set to int \n";
    cout << guy.blab(10.0, 2.3) << endl;
    cout << "U was set to double \n";
    cout << "done!";

    return 0;
}

#endif
